
/**
 * 管理window层级直接的消息传递
 * 
 * 使用示例：
 * 
 * // 订阅消息
 * const unsubscribe = subscribe('USER_LOGIN', (data) => {
 *   console.log('用户登录:', data);
 * });
 * 
 * // 发送消息给父窗口
 * postMessage({ type: 'USER_LOGIN', data: { userId: 123 } });
 * 
 * // 发送消息给内嵌页面
 * sendMessageToInnerPage('THEME_CHANGE', { theme: 'dark' });
 * 
 * // 取消订阅
 * unsubscribe();
 */
const messageHandleList = {};

function hitType(type) {
  return type in messageHandleList;
}

// 接收消息
window.addEventListener("message", (evt) => {
  if (!evt.data || !evt.data.type) return;
  const type = evt.data.type;
  if (!hitType(type)) return;
  messageHandleList[type].forEach(handler => {
    try {
      handler.call(null, evt.data.data);
    } catch (error) {
      console.error(`[message] Handler error for type ${type}:`, error);
    }
  });
});

/**
 * 订阅消息
 * @param {string} type - 消息类型
 * @param {function} handler - 处理函数
 * @returns {function} 取消订阅函数
 */
export function subscribe(type, handler) {
  if (!messageHandleList[type]) {
    messageHandleList[type] = [];
  }
  messageHandleList[type].push(handler);
  
  // 返回取消订阅函数
  return () => {
    const handlers = messageHandleList[type];
    if (handlers) {
      const index = handlers.indexOf(handler);
      if (index > -1) {
        handlers.splice(index, 1);
      }
      // 如果没有处理函数了，删除该类型
      if (handlers.length === 0) {
        delete messageHandleList[type];
      }
    }
  };
}



/**
 * 发布消息
 * @param {*} message
 * @param {*} target 默认值top
 */
export function postMessage(message, target) {
  if (!target) return top.postMessage(message, "*");
  try {
    target.top.postMessage(message, "*");
  } catch (e) {
    throw new Error(`[web2.0] ${e.message}`);
  }
}


/**
 * 向内嵌页面发送消息
 * @param {string} evtType - 事件类型
 * @param {any} _data - 数据
 */
export function sendMessageToInnerPage(evtType, _data) {
  const iframes = document.querySelectorAll("iframe.mvcFrameStyle");
  if (!iframes.length) return;

  // 查找第一个可见的iframe
  const visibleIframe = Array.from(iframes).find(iframe => 
    iframe.style.display !== 'none'
  );
  
  if (!visibleIframe) return;

  try {
    // 事件命名规范：关键应用_XXXXX
    const message = { type: evtType, data: _data };
    console.log('postMessage', message);
    visibleIframe.contentWindow.postMessage(message, "*");
  } catch (error) {
    console.error(`[message] Failed to send message to iframe:`, error);
  }
}
